/*-------------------------------------------------------------------------
 *
 * pg_operator.h
 *	  "操作符"系统目录的定义 (pg_operator)
 *
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/catalog/pg_operator.h
 *
 * NOTES
 *	  Catalog.pm模块读取此文件并推导模式
 *	  信息。
 *
 *-------------------------------------------------------------------------
 */
#ifndef PG_OPERATOR_H
#define PG_OPERATOR_H

#include "catalog/genbki.h"
#include "catalog/objectaddress.h"
#include "catalog/pg_operator_d.h"
#include "nodes/pg_list.h"

/* ----------------
 *		pg_operator 定义。 cpp 将其转换为
 *		typedef struct FormData_pg_operator
 * ----------------
 */
CATALOG(pg_operator,2617,OperatorRelationId)
{
	Oid			oid;			/* oid */

	/* 操作符的名称 */
	NameData	oprname;

	/* 包含此操作符的命名空间的 OID */
	Oid			oprnamespace BKI_DEFAULT(pg_catalog) BKI_LOOKUP(pg_namespace);

	/* 操作符所有者 */
	Oid			oprowner BKI_DEFAULT(POSTGRES) BKI_LOOKUP(pg_authid);

	/* 'l' 表示前缀或 'b' 表示中缀 */
	char		oprkind BKI_DEFAULT(b);

	/* 可以用于归并连接吗？ */
	bool		oprcanmerge BKI_DEFAULT(f);

	/* 可以用于哈希连接吗？ */
	bool		oprcanhash BKI_DEFAULT(f);

	/* 左侧参数类型，如果是前缀操作符则为 0 */
	Oid			oprleft BKI_LOOKUP_OPT(pg_type);

	/* 右侧参数类型 */
	Oid			oprright BKI_LOOKUP(pg_type);

	/* 结果数据类型；在“shell”操作符中可以为 0 */
	Oid			oprresult BKI_LOOKUP_OPT(pg_type);

	/* 交换操作符的 OID，如果没有则为 0 */
	Oid			oprcom BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_operator);

	/* 取反操作符的 OID，如果没有则为 0 */
	Oid			oprnegate BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_operator);

	/* 基础函数的 OID；在“shell”操作符中可以为 0 */
	regproc		oprcode BKI_LOOKUP_OPT(pg_proc);

	/* 约束估算器的 OID，或 0 */
	regproc		oprrest BKI_DEFAULT(-) BKI_LOOKUP_OPT(pg_proc);

	/* 连接估算器的 OID，或 0 */
	regproc		oprjoin BKI_DEFAULT(-) BKI_LOOKUP_OPT(pg_proc);
} FormData_pg_operator;

/* ----------------
 *		Form_pg_operator 对应于指向具有
 *		pg_operator 关系格式的元组的指针。
 * ----------------
 */
typedef FormData_pg_operator *Form_pg_operator;

DECLARE_UNIQUE_INDEX_PKEY(pg_operator_oid_index, 2688, OperatorOidIndexId, on pg_operator using btree(oid oid_ops));
DECLARE_UNIQUE_INDEX(pg_operator_oprname_l_r_n_index, 2689, OperatorNameNspIndexId, on pg_operator using btree(oprname name_ops, oprleft oid_ops, oprright oid_ops, oprnamespace oid_ops));


extern ObjectAddress OperatorCreate(const char *operatorName,
									Oid operatorNamespace,
									Oid leftTypeId,
									Oid rightTypeId,
									Oid procedureId,
									List *commutatorName,
									List *negatorName,
									Oid restrictionId,
									Oid joinId,
									bool canMerge,
									bool canHash);

extern ObjectAddress makeOperatorDependencies(HeapTuple tuple,
											  bool makeExtensionDep,
											  bool isUpdate);

extern void OperatorUpd(Oid baseId, Oid commId, Oid negId, bool isDelete);

#endif							/* PG_OPERATOR_H */
